home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / incl / LEDA.020+881 / impl / dlist.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-05  |  6.8 KB  |  248 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  dlist.h
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15.  
  16. #ifndef LEDA_DLIST_H
  17. #define LEDA_DLIST_H
  18.  
  19. //------------------------------------------------------------------------------
  20. //  doubly linked lists
  21. //------------------------------------------------------------------------------
  22.  
  23. #include <LEDA/basic.h>
  24.  
  25. //------------------------------------------------------------------------------
  26. // some declarations
  27. //------------------------------------------------------------------------------
  28.  
  29. class dlist; 
  30. class dlink;
  31.  
  32. typedef dlink* list_item;
  33.  
  34. //------------------------------------------------------------------------------
  35. // class dlink (list items)
  36. //------------------------------------------------------------------------------
  37.  
  38. class dlink {
  39.  
  40.   dlink* succ;
  41.   dlink* pred;
  42.   GenPtr e;
  43.  
  44.   dlink(GenPtr a, dlink* pre, dlink* suc)
  45.   { 
  46.     e = a;
  47.     succ = suc;
  48.     pred = pre;
  49.   }
  50.  
  51.   LEDA_MEMORY(dlink)
  52.  
  53.  
  54.   friend class dlist;
  55.   FRIEND_INLINE dlink* succ_item(dlink* p);
  56.   FRIEND_INLINE dlink* pred_item(dlink* p);
  57.  
  58.  
  59.   //space: 3 words = 12 bytes
  60. };
  61.  
  62.  
  63. inline dlink* succ_item(dlink* p) { return p->succ; }
  64. inline dlink* pred_item(dlink* p) { return p->pred; }
  65.  
  66.  
  67. //------------------------------------------------------------------------------
  68. // dlist: base class for all doubly linked lists
  69. //------------------------------------------------------------------------------
  70.  
  71. class dlist {
  72.  
  73.    dlink* h;                     //head
  74.    dlink* t;                     //tail
  75.    dlink* iterator;              //iterator
  76.    int count;                    //length of list
  77.  
  78. //space: 4 words + virtual =  5 words = 20 bytes
  79.  
  80. virtual int  cmp(GenPtr x, GenPtr y)  const { return compare(x,y); }
  81. virtual void read_el(GenPtr&,istream&) {}
  82. virtual void print_el(GenPtr& x,ostream& out) const { Print(int(x),out); }
  83. virtual void clear_el(GenPtr&) const {}
  84. virtual void copy_el(GenPtr&)  const {}
  85. virtual int  int_type() const { return 0; }
  86.  
  87. void quick_sort(list_item*,list_item*);
  88. void quick_sort(list_item*,list_item*,CMP_PTR);
  89. void int_quick_sort(list_item*,list_item*);
  90.  
  91. void insertion_sort(dlink**,dlink**,dlink**);
  92. void insertion_sort(dlink**,dlink**,dlink**,CMP_PTR);
  93. void int_insertion_sort(dlink**,dlink**,dlink**);
  94.  
  95. void recompute_length() const;
  96.  
  97. public:
  98.  
  99. // access operations
  100.  
  101.    int  length() const { if (count < 0) recompute_length(); return count; }
  102.    int  size()   const { return length(); }
  103.    bool empty()  const { return h==nil; }
  104.  
  105.    dlink* first()               const { return h; }
  106.    dlink* first_item()          const { return h; }
  107.    dlink* last()                const { return t; }
  108.    dlink* last_item()           const { return t; }
  109.    dlink* next_item(dlink* p)   const { return p->succ; }
  110.    dlink* succ(dlink* l)        const { return l->succ; }
  111.    dlink* pred(dlink* l)        const { return l->pred; }
  112.    dlink* cyclic_succ(dlink*)   const;
  113.    dlink* cyclic_pred(dlink*)   const;
  114.    dlink* succ(dlink* l, int i) const; 
  115.    dlink* pred(dlink* l, int i) const;
  116.    dlink* get_item(int = 0)     const; 
  117.  
  118.    dlink* max(CMP_PTR) const;
  119.    dlink* min(CMP_PTR) const;
  120.    dlink* search(GenPtr) const;
  121.  
  122.    int    rank(GenPtr) const;
  123.  
  124.    GenPtr contents(dlink* l) const { return l->e; }
  125.    GenPtr head()             const { return h ? h->e : 0;}
  126.    GenPtr tail()             const { return t ? t->e : 0;}
  127.  
  128.  
  129. // update operations
  130.  
  131. protected:
  132.  
  133.    dlink* insert(GenPtr a, dlink* l, int dir=0);
  134.  
  135.    dlink* push(GenPtr a)   
  136.    { count++;
  137.      if (h) h = h->pred = new dlink(a,0,h); 
  138.      else   h = t =  new dlink(a,0,0);
  139.      return h;
  140.     }
  141.    
  142.    dlink* append(GenPtr a)
  143.    { count++;
  144.      if (t) t = t->succ = new dlink(a,t,0);
  145.      else   t = h = new dlink(a,0,0);
  146.      return t; 
  147.     } 
  148.    
  149.    void   assign(dlink* l, GenPtr a) { copy_el(a); l->e = a; }
  150.  
  151.  
  152. public:
  153.  
  154.    GenPtr del(dlink* loc);
  155.    GenPtr pop();
  156.    GenPtr Pop();
  157.  
  158.    void   conc(dlist&,int dir=0);
  159.    void   split(list_item,dlist&,dlist&,int dir=0);
  160.    void   apply(APP_PTR);
  161.    void   sort(CMP_PTR);
  162.    void   bucket_sort(int,int,ORD_PTR);
  163.    void   permute();
  164.    void   clear();
  165.  
  166. // iteration
  167.  
  168.    void   set_iterator(dlink* p)   const { (dlink*&)iterator = p; }
  169.    void   start_iteration()        const { set_iterator(h); }
  170.    void   Start_iteration()        const { set_iterator(t); }
  171.    void   move_to_succ()           const { set_iterator(iterator->succ); }
  172.    void   move_to_pred()           const { set_iterator(iterator->pred); }
  173.    dlink* read_iterator(GenPtr& x) const { if (iterator) x = iterator->e; 
  174.                                            return iterator; }
  175.    dlink* read_ptr_iterator(GenPtr& x) 
  176.                                    const { if (iterator) x = iterator->e; 
  177.                                            return iterator; }
  178.  
  179.    GenPtr loop_to_succ(GenPtr& x) const { return x = list_item(x)->succ; }
  180.    GenPtr loop_to_pred(GenPtr& x) const { return x = list_item(x)->pred; }
  181.  
  182.  
  183. //  old iteration stuff
  184.  
  185.    void  reset()               const { set_iterator(nil); }
  186.    void  init_iterator()       const { set_iterator(nil); }
  187.  
  188.    dlink* get_iterator()       const { return iterator; }
  189.    dlink* move_iterator(int=0) const;
  190.  
  191.    bool   current_element(GenPtr&) const;
  192.    bool   next_element(GenPtr&)    const;
  193.    bool   prev_element(GenPtr&)    const;
  194.  
  195.  
  196. // operators
  197.  
  198.    GenPtr&   entry(dlink* l)            { return l->e; }
  199.    GenPtr    inf(dlink* l)        const { return l->e; }
  200.    GenPtr&   operator[](dlink* l)       { return l->e; }
  201.    GenPtr    operator[](dlink* l) const { return l->e; }
  202.  
  203.    dlist& operator=(const dlist&); 
  204.    dlist  operator+(const dlist&); 
  205.  
  206.  
  207.    void print(ostream&,string, char)       const;    
  208.    void print(ostream& out,char space=' ') const { print(out,"",space);  }
  209.    void print(string s, char space=' ')    const { print(cout,s,space);  }
  210.    void print(char space=' ')              const { print(cout,"",space); }   
  211.  
  212.  
  213.    void read(istream&,string, char);  
  214.  
  215.    void read(istream& in,char delim) { read(in,"",delim); }
  216.    void read(istream& in)            { read(in,"",EOF); }
  217.  
  218.    void read(string s, char delim)  { read(cin,s,delim); }   
  219.    void read(string s)              { read(cin,s,'\n'); }   
  220.  
  221.    void read(char delim)  { read(cin,"",delim);}  
  222.    void read()            { read(cin,"",'\n');}  
  223.  
  224.  
  225. // constructors & destructors
  226.  
  227.    dlist();    
  228.    dlist(GenPtr a);
  229.    dlist(const dlist&);
  230.  
  231.    virtual ~dlist()  { clear(); }
  232.  
  233.    int space()  const { return sizeof(dlist) + count * sizeof(dlink); }
  234. };
  235.  
  236.  
  237.  
  238. // default I/O and cmp functions
  239.  
  240. inline void Print(const dlist& L,ostream& out) { L.print(out); }
  241.  
  242. inline void Read(dlist& L, istream& in) { L.read(in); }
  243.  
  244. inline int compare(const dlist&,const dlist&) { return 0; }
  245.  
  246. #endif
  247.